#ifndef WORKER_TEST_H_
#define WORKER_TEST_H_

#include <Mutex.hh>
#include <AutoLock.hh>
#include <Worker.hh>
#include "Test.hh"

//
/**
 * \file WorkerTest.hh
 * \author  jsk <jsk.jinsubkim@gmail.com>
 * \version 1.0
 *
 * \class WorkerTest WorkerTest.hh
 *
 * 
 */
class WorkerTest : public Test
{
public:
	/**
	 * \name testBasicCase
	 * 
	 * 한 워커가 작업을 정상적으로 수행하는지 검증한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf testBasicCase(Worker* Worker);
	
	/**
	 * \name testCooperation
	 * 
	 * 여러 워커가 한 큐를 공유해서 작업을 나누어 수행하는지 검증한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf testCooperation(Worker* W, Worker* W2, Worker* W3);
};

//
/**
 * \file WorkerTest.hh
 * \author  jsk <jsk.jinsubkim@gmail.com>
 * \version 1.0
 *
 * \class CAddTask WorkerTest.hh
 *
 * 
 */
class CAddTask : public Task
{
public:
	ResultOf perform()
	{
		AutoLock AutoKey(&Key);
		
		Sum += OwnData;
		return RETURN_OK;
	}

	ResultOf setData(void* Data)
	{
		OwnData = (USNumber)Data;
		return RETURN_OK;
	}
	
	static Number report()
	{
		return Sum;
	}
	
protected:
	Number OwnData;
	static Mutex Key;
	static Number Sum;
};

#endif //WORKER_TEST_H_